package solutions.ferpa.ztest.intf;

import br.com.telescope.adsrt.dom.DomText;
import br.com.telescope.adsrt.lib.*;
import br.com.telescope.adsrt.lib.Field;
import br.com.telescope.auth.AdsrtUser;
import br.com.telescope.t2.AccessPolicy;
import br.com.telescope.t2.ServiceModel;
import br.com.telescope.t2.exception.ApplicationRuntimeException;
import br.com.telescope.t2.feature.CustomFeature;
import br.com.telescope.util.StringReplacer;
import java.util.ArrayList;
import java.util.List;
import solutions.ferpa.ztest.ent.*;

/**
 * Ativar conta do usuário.
 * <p>
 * Interface para receber a requisição de confirmação de ativição de 
 * usuário no sistema.
 * <P>
 * Caso a requisição seja válida, ativar o usuário.
 * <P>
 * Caso contrário, apresentar mensagem de erro.
 * <P>
 * 
 * <P>
 * A requisição é válida quando o hashcode está ok.
 * <P>
 * 
 * <P>
 * Telescope origin: RTAUTH.ATIVAR_CONTA
 * <P>
 * @author TELESCOPE - Build task T2 Web Interface Generator
 * <P>
 * @version 0.1
 */
public class AtivarConta extends ServiceModel {
    
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    public static final String GLOBAL_NAME = "RTAUTH.ATIVAR_CONTA";
    
    @Override
    public String globalName() {
        return GLOBAL_NAME;
    }
    
    {
        setTitle("Ativar conta do usuário");
    }
    
    
    // Service parameters
    private DomText pHash;
    
    // Record items
    
    // Query items
    
    @Override
    public void initAttributes() {
        
    }
    
    @Override
    public void initParameters() {
        pHash = new DomText(ctx, "HASH", "Hash");
        pHash.setValue(ctx.getParameter("P_HASH"));
        pHash.setUnbound(true);
    }
    
    @Override
    public List<Field> getParameters() {
        if (allParameters == null) {
            allParameters = new ArrayList<Field>();
            allParameters.add(pHash);
        }
        return allParameters;
    }
    
    @Override
    public String getDefaultOrderBy() {
        return "";
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="CUSTOM">
    public class FCustom extends CustomFeature {
        
        @Override
        public void initForm() {
        }
        
        @Override
        public int getAccessPolicy() {
            return AccessPolicy.PUBLIC;
        }
        
        @Override
        public void preDisplay() {
            try {
                confirmaAtivacao();
            } catch (AdsException ex) {
                throw new ApplicationRuntimeException(ex);
            }
        }
        
        {
            setFeatureName("CUSTOM");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="initFeatures">
    
    @Override
    protected void initFeatures() {
        addFeature(new FCustom());
        super.initFeatures();
    }
    
    @Override
    public String getDefaultFeature() {
        return "CUSTOM";
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Getters and Setters">
    
    public String getParameterHash() {
        return pHash.getValue();
    }
    
    public void setParameterHash(String value) {
        pHash.setValue(value);
    }
    // </editor-fold>
    
    /**
     * Confirma ativação.
     * <p>
     * Confere os parâmetro e chave de ativação e faz o login do usuário ou 
     * apresenta mensagem de erro.
     */
    private void confirmaAtivacao() throws AdsException {
        // <user-code id="799792" parentId="792818" hashcode="5132d800" length="1494">
        // import br.com.telescope.auth.AdsrtUser;
        // import br.com.telescope.util.StringReplacer;
        
        StringBuilder msg = new StringBuilder();
        
        if (ctx.getPreference("RTAUTH.CREATE_ACCOUNT", "N").equals("S")) {
            String chaveAtivacao = ctx.getParameter("P_HASH");
            EntChavesAtivacao chave = new EntChavesAtivacao(ctx);
            try {
                chave.findByChaveAtivacao(chaveAtivacao);        
                try {
                    ctx.beginTransaction();
        
                    EntUsuarios usuario = chave.findUsuario();
                    usuario.setAtivo("S");
                    usuario.upd();
        
                    // Exclui a chave de ativação (indica que a conta foi ativada)
                    chave.del();
        
                    ctx.endTransaction();
                    ctx.getSession().setObject("MENU", null);
                    ctx.getSession().login(usuario.getUser());
        
                    ctx.p(ctx.getPreference("RTAUTH.ATIVAR_CONTA.SUCCESS", "Conta confirmada com sucesso"));
                } catch (Exception ex) { 
                    try {
                        ctx.abortTransaction();
                    } catch (Exception ex1) { 
                        throw new AdsException(ex1, "",  AdsException.UNKNOWN, ex1.toString());
                    }
                }
            } catch (RecordNotFoundException e) { 
                ctx.pushError(globalName() + ".INVALID_HASH", AdsException.ERROR, "Chave de ativação inválida");
            }
        } else {
             ctx.pushError(GLOBAL_NAME + ".CREATE_ACCOUNT_DISABLED", AdsException.ERROR, "Esta aplicação não permite criar contas usando a chave de ativação.");
        }
        // </user-code>
    }
}
